package org.wheel.plugins.toolkit.sql.enums;

import cn.hutool.db.dialect.DialectName;
import lombok.Getter;
import org.wheel.plugins.toolkit.sql.page.BuiltinPaginationStrategy;
import org.wheel.plugins.toolkit.sql.page.PaginationStrategy;

import java.util.Optional;

public enum Dialect {
    // Hutool的DialectName 原有的方言
    ANSI("ansi"),
    MYSQL("mysql"),
    ORACLE("oracle"),
    POSTGRESQL("postgresql"),
    SQLITE3("sqlite3"),
    H2("h2"),
    SQLSERVER("sqlserver"),
    SQLSERVER2012("sqlserver2012"),
    PHOENIX("phoenix"),
    HANA("hana"),

    // 添加国产数据库
    DM("dm"),                // 达梦
    KINGBASE("kingbase"),    // 人大金仓
    OSCAR("oscar"),          // 神通
    GBASE("gbase"),          // 南大通用
    GAUSSDB("gaussdb"),      // 华为高斯
    ;

    @Getter
    private final String name;
    Dialect(String name) {
        this.name = name;
    }

    /**
     * 转换为Hutool的DialectName（如果匹配）
     * @return
     */
    public Optional<DialectName> toHutoolDialect() {
        try {
            return Optional.of(DialectName.valueOf(this.name().toUpperCase()));
        } catch (IllegalArgumentException e) {
            return Optional.empty();
        }
    }

    public PaginationStrategy getBuiltInPageStrategy() {
        return BuiltinPaginationStrategy.valueOf(this.name());
    }

    /**
     * 是否支持 WITH 语法
     * @return 是否支持 WITH 语法：true/false
     */
    public boolean supportsWith() {
        return switch (this) {
            case POSTGRESQL, SQLSERVER, SQLSERVER2012, ORACLE, DM, KINGBASE, GAUSSDB -> true;
            case MYSQL -> true;          // 8.0+ 已支持
            case SQLITE3 -> true;        // 3.25+ 支持
            default -> false;
        };
    }
}